From 12785284adc04d64ab7bdda03dd1ba7ba0551521 Mon Sep 17 00:00:00 2001 From: "mafetter@fleming.research" Date: Wed, 23 Mar 2005 17:07:19 +0000 Subject: [PATCH] bitkeeper revision 1.1259 (4241a247utqWSkcNHjYx45_xeNZjqg) Unshadow any L2 that, when updated, has no valid entries left... Signed-off-by: michael.fetterman@cl.cam.ac.uk --- xen/arch/x86/shadow.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 85c43c37a2..db39ea56d4 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -2050,6 +2050,7 @@ static int resync_all(struct domain *d, u32 stype) } break; case PGT_l2_shadow: + max = -1; for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ ) { if ( !is_guest_l2_slot(i) && !external ) @@ -2065,17 +2066,18 @@ static int resync_all(struct domain *d, u32 stype) // // snapshot[i] = new_pde; } + if ( new_pde != 0 ) + max = i; // XXX - This hack works for linux guests. // Need a better solution long term. if ( !(new_pde & _PAGE_PRESENT) && unlikely(new_pde != 0) && !unshadow && (frame_table[smfn].u.inuse.type_info & PGT_pinned) ) - { - perfc_incrc(unshadow_l2_count); unshadow = 1; - } } + if ( max == -1 ) + unshadow = 1; break; default: for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ ) @@ -2102,7 +2104,10 @@ static int resync_all(struct domain *d, u32 stype) unmap_domain_mem(guest); if ( unlikely(unshadow) ) + { + perfc_incrc(unshadow_l2_count); shadow_unpin(smfn); + } } return need_flush; -- 2.30.2